<?php

	require_once("src/view/PageView.php");	
	require_once("src/view/LoginForm.php"); 
	require_once("src/view/LoggedInView.php");	
	require_once("src/model/CheckLoginForm.php");


class MasterController
{	
 
    /**
 	* @var string. $html, The html we'll echo out.	 
 	*/
	private $html = "";
	
	/**
 	*  @var PageView Objekt. $pageView,
 	*/
	private $pageView;
	
	/**
 	*  @var LoginForm Objekt.  $loginForm,
 	*/
	private $loginForm;
	
	/**
 	*  @var  LoggedInView Objekt. $loggedInPage,
 	*/
	private $loggedInPage;
	
	/**
 	*  @var  CheckLoginForm Objekt. $checkLoginForm,
 	*/
	private $checkLoginForm;
	
		
	public function __construct()
	{
 		$this->pageView = new PageView();
		$this->loginForm = new LoginForm();
		$this->loggedInPage = new LoggedInView(); 
		$this->checkLoginForm = new CheckLoginForm($this->loginForm->GetUsername(), 
							                 	   $this->loginForm->GetUserPassword(), 
							                 	   $this->GetLoginSession());
	}
	
	
	/**
	 * @return string, the html to display.
	 */	
	public function CheckWhatHTMLToShow() // TODO: lång jäkel
	{
		$this->CheckIfPost();
		$this->DefaultIPandUserAgentValues();
		
		$sessionLogin = $this->GetLoginSession();
		$sessionMessage = $this->GetMessageSession();
		$sessionLastEnteredUsername = $this->GetLastEnteredUsernameSession();
		
		if($this->CheckForSessionHijack())
		{	
			$this->SessionHijack(); 
		}
		elseif($this->loginForm->OnlyOneCookiesExists() || $this->loginForm->AreLoginCookiesSet())
		{ 
			$this->GetCookieHTML($sessionLogin, $sessionLastEnteredUsername);
		}
		elseif(!$this->loginForm->OnlyOneCookiesExists() && !$this->loginForm->AreLoginCookiesSet())
		{
			if($sessionLogin === true && !array_key_exists('logout', $_GET)) 
			{
				$this->GetLoginPage($sessionLastEnteredUsername, $sessionMessage);										    	
				$this->SetMessageSession(""); 
			}
			elseif(array_key_exists('logout', $_GET))   
		    {
				if($sessionLogin === true)
				{
					$this->GetLoginForm("Du har lyckats logga ut!",""); 				
					$this->loginForm->DestroyLoginCookies(); 
					$this->SetLoginSession(false);
				}
				else // om någon skriver logout i urlen. när vi inte är inloggade.
				{
					$this->GetLoginForm("",""); 
				}			
		    }
		    elseif(!array_key_exists('logout', $_GET) && $sessionLogin === true)
			{
				$this->GetLoginForm($sessionMessage, $sessionLastEnteredUsername);
			}
			elseif(array_key_exists('login', $_GET) && $sessionLogin === false) 
			{
				$this->GetLoginForm($sessionMessage, $sessionLastEnteredUsername);
			}     
			else 
			{
				$this->GetLoginForm("","");
			}
		}
		return $this->html;
	}


	/**
	 * 
	 * @param $sessionLogin string
	 * @param $sessionLastEnteredUsername string
	 */
	 
	private function GetCookieHTML($sessionLogin,$sessionLastEnteredUsername)
	{
		if($this->CookiesAreOK() && $sessionLogin === false &&
		!array_key_exists('logout', $_GET))
		{
			// Kollar igenom våra kakor ordentligt, om OK, så är vi inloggade, annars
			// har precis loggat in.
			$this->CookieLogin();
		}
		elseif($this->CookiesAreOK() && $sessionLogin === true &&
		!array_key_exists('logout', $_GET))
		{
			// då var vi redan inloggade, men har skapat kakor som är validera och OK.
			$this->GetLoginPage($sessionLastEnteredUsername, ""); 
			
		}
		elseif(array_key_exists('logout', $_GET))
		{
			// då loggas vi bara ut.
			$this->GetLoginForm("Du har lyckats logga ut!",""); 				
			$this->loginForm->DestroyLoginCookies(); 
			$this->SetLoginSession(false);
			$this->SetMessageSession("");
		}
		else
		{
			// alltid.. alltid om det finns en elr flera kakor, och inget av dem ovanstående
			// är sanna, så är det dålig(a) kak(a/or).
			$this->BadCookies();
		}
	}


	// TODO:: LITE LÅNG, MEN DEN FUNKAR. Tycker bara det blir jobbigare annars.
	private function CheckIfPost() 
	{
		if($_SERVER['REQUEST_METHOD'] == 'POST' && !$this->GetLoginSession()) 
		{	
			if($this->checkLoginForm->IsUsernameMissing())
			{	
				$this->SetLastEnteredUsernameSession("");
				$this->SetMessageSession("Användarnamn saknas.");
			}
			elseif($this->checkLoginForm->IsPasswordMissing())
			{
				$this->SetMessageSession("Lösenord saknas");
				$this->SetLastEnteredUsernameSession($this->loginForm->GetUsername());
			}
			else
			{      
				if($this->checkLoginForm->CheckLoginInfo())
				{
					if($this->loginForm->RememberMe())
					{
						$this->SetMessageSession('Du har loggat in, och vi kommer ihåg dig nästa gång.');
					}
					else 
					{   // lyckats logga in.
						$this->SetMessageSession('Du har loggat in.');	
					}
					$this->SetLoginSession(true);
					$this->SetLastEnteredUsernameSession($this->loginForm->GetUsername());
				}
				elseif(!$this->checkLoginForm->CheckLoginInfo())
				{
					$this->SetMessageSession('Fel användarnamn och/eller lösenord.');	
					$this->SetLastEnteredUsernameSession($this->loginForm->GetUsername());
				}
			}
		}
	}



	/**
	 * @return boolean
	 */
	private function CheckForSessionHijack()
	{
		if($this->GetUserAgentSession() != $_SERVER["HTTP_USER_AGENT"] ||
    	   $this->GetIPSession()        != $_SERVER["REMOTE_ADDR"])
		{
			return true;
		}
		return false;
	}


	private function SessionHijack()
	{
		$this->loginForm->DestroyLoginCookies(); 
		$this->SetMessageSession("");
		$this->SetLoginSession(false);
		$this->GetLoginForm("Tjuvjävel!",""); 		
		$this->SetLastEnteredUsernameSession(""); 
	}
	
	private function BadCookies()
	{
		$this->loginForm->DestroyLoginCookies();   
		$this->SetLoginSession(false);
		$this->SetLastEnteredUsernameSession("");
		$this->GetLoginForm("Fiffla inte med kakorna!",""); 
	}


	private function CookieLogin()
	{
		$this->SetLoginSession(true);
		$this->SetMessageSession(""); 
		$this->SetLastEnteredUsernameSession($this->loginForm->GetCookieUsername());
		$this->GetLoginPage($this->GetLastEnteredUsernameSession(), "VI KOM IHÅG DIG!");
	}
    


	/**
	 * @param $formMessage string
	 * @param $lastEnteredUsername string
	 */
	public function GetLoginForm($formMessage, $lastEnteredUsername)
	{	
		$theLoginForm = $this->loginForm->GetForm($formMessage,$lastEnteredUsername);									
		$this->html = $this->pageView->HtmlPage("Laboration2PHP", "", $theLoginForm);
	}


	public function GetLoginPage($LastEntUsername, $message)
	{	
		$loggedInHTML = $this->loggedInPage->LoggedInPage($LastEntUsername, $message);	
		$this->html = $this->pageView->HtmlPage("Laboration2PHP1", "", $loggedInHTML);
	}
	
	
	
		
	/**
	 * @return boolean.
	 */	
	public function CookiesAreOK()
	{
		if($this->loginForm->CookiesExistsAndIsOK())
		{
			return true;
		}
		else 
		{
			return false;		
		}		
	}	
	
	

	
	
	
	public function DefaultIPandUserAgentValues()
	{
		if(isset($_SESSION['Webbläsare']) == false)
		{
			  $_SESSION['Webbläsare'] = $_SERVER["HTTP_USER_AGENT"];
		}
		 
		if(isset($_SESSION['ip']) == false)
		{
			  $_SESSION['ip'] = $_SERVER["REMOTE_ADDR"];
		}		
	}
	
	
	
	/**
	 * @Return string, ip adrs till användaren.
	 */
	public function GetIPSession()
	{
		 return $_SESSION['ip'];
		 
	}
	 
	 /**
	 * @Return string, vilken webbläsare.
	 */
	public function GetUserAgentSession()
	{
		
		 return $_SESSION['Webbläsare'];
		
	}
	
	/**
	 * @return bool
	 */
	public function GetLoginSession()
	{
		if(isset($_SESSION['loggedIn']))
		{
			return $_SESSION['loggedIn'];
		}
		else return FALSE;
	}
	
	/**
	 * @return string
	 */
	public function GetLastEnteredUsernameSession()
	{
		if(isset($_SESSION['lastEnteredUsername']))
		{
			return htmlspecialchars($_SESSION['lastEnteredUsername']);
		}
		else
		{
			return "";
		} 
		
	}
	
	/**
	 * @return string
	 */
	public function GetMessageSession()
	{
		if(isset($_SESSION['message']))
		{
			return htmlspecialchars($_SESSION['message']);
		}
		else
		{
			return "";
		} 
	}
	
	
	
	
	

	
	/**
	 * @param $loginBool, boolean,
	 */
	public function SetLoginSession($loginBool)
	{
		$_SESSION['loggedIn'] = $loginBool;
	}
	
	/**
	 * @param  $lastEnteredUsername, string
	 */
	public function SetLastEnteredUsernameSession($lastEnteredUsername)
	{
		$_SESSION['lastEnteredUsername'] = $lastEnteredUsername;
	}
	
	/**
	 *@param  $message, string
	 */
	public function SetMessageSession($message)
	{
		$_SESSION['message'] = $message;
	}
	
}
	
	
	
	
	
	
	
	